package mvc.handlers;

import entity.CorsoStudio;
import entity.Studente;
import facade.CorsoStudioFacadeRemote;
import session.AddStudenteLocal;

import mvc.framework.*;

import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 * Handler per gestire l'azione di visualizzazione del profilo di un utente
 * 
 * @author Grillo
 */
public class AddStudenteHandler extends AbsRequestHandler {

    //costanti di errore
    public final static int ERR_MISSED_FIELD = 1;
    public final static int ERR_PWD = 2;
    public final static int ERR_LOGIN = 3;

    private final static String ACTION_NAME = "addStudente";

    public AddStudenteHandler(DialogHandler dHandler) {
        super(dHandler);

        //Aggiungo la descrizione degli errori
        errors.add("Attenzione i campi contrassegnati con * sono obbligatori");
        errors.add("Attenzione la password non è stata confermata correttamente");
        errors.add("L'azione richiesta necessita di essere collegati e avere le autorizzazioni necessarie");
    }

    public String getActionName() {
        return ACTION_NAME;
    }
    
    public void setNextPage() {
        nextPage = "/views/addStudente.jsp";
    }
    
    public int validate() {
        String nome = null;
        String cognome = null;
        String password = null;
        String confPassword = null;
        String mail = null;
        Integer corso = null;

        if(SessionManager.getAttribute(dialogHandler.getSession(), "tipo_utente")==null || !SessionManager.getAttribute(dialogHandler.getSession(), "tipo_utente").equals("SEGRETERIA")) {
            nextPage = "/views/home.jsp";
            return ERR_LOGIN;
        }
        
        boolean save = Boolean.parseBoolean(dialogHandler.getParameter("save"));

        if(save) {
            //se l'utente è impostato mi aspetto i dati nel form
            nome = dialogHandler.getParameter("nome");
            cognome = dialogHandler.getParameter("cognome");
            password = dialogHandler.getParameter("password");
            confPassword = dialogHandler.getParameter("confPassword");
            mail = dialogHandler.getParameter("mail");
            corso = Integer.parseInt(dialogHandler.getParameter("corso"));
            if(nome!=null && !nome.equals("") &&
               cognome!=null && !cognome.equals("") &&
               password!=null && !password.equals("") &&
               confPassword!=null && !confPassword.equals("") &&
               mail!=null && !mail.equals("") &&
               corso!=null && !corso.equals(0)) {
                if(password.equals(confPassword))
                    return SUCCESS;
                else {
                    Studente stud = new Studente();
                    stud.setNome(dialogHandler.getParameter("nome"));
                    stud.setCognome(dialogHandler.getParameter("cognome"));
                    stud.setMail(dialogHandler.getParameter("mail"));
                    stud.setIndirizzo(dialogHandler.getParameter("indirizzo"));
                    stud.setIdcorso(new CorsoStudio(Integer.parseInt(dialogHandler.getParameter("corso"))));
                    SessionManager.setAttribute(dialogHandler.getSession(), "studente", stud);
                    return ERR_PWD;
                }
            } else {
                Studente stud = new Studente();
                stud.setNome(dialogHandler.getParameter("nome"));
                stud.setCognome(dialogHandler.getParameter("cognome"));
                stud.setMail(dialogHandler.getParameter("mail"));
                stud.setIndirizzo(dialogHandler.getParameter("indirizzo"));
                stud.setIdcorso(new CorsoStudio(Integer.parseInt(dialogHandler.getParameter("corso"))));
                SessionManager.setAttribute(dialogHandler.getSession(), "studente", stud);
                return ERR_MISSED_FIELD;
            }
        } else
            return SUCCESS;
    }

    public int execute() {
        AddStudenteLocal addBean = null;
        CorsoStudioFacadeRemote corsoStudioFacade = null;

        boolean save = Boolean.parseBoolean(dialogHandler.getParameter("save"));

        //Bind agli EJB
        try {
            Context c = new InitialContext();
            corsoStudioFacade = (CorsoStudioFacadeRemote) c.lookup("facade.CorsoStudioFacadeRemote");
            addBean = (AddStudenteLocal) c.lookup("java:comp/env/AddStudenteBean");
        } catch (NamingException ne) {}

        if(save) {
            if(!addBean.creaStudente(dialogHandler.getRequest())) {
                Studente stud = new Studente();
                stud.setNome(dialogHandler.getParameter("nome"));
                stud.setCognome(dialogHandler.getParameter("cognome"));
                stud.setPassword(dialogHandler.getParameter("password"));
                stud.setMail(dialogHandler.getParameter("mail"));
                stud.setIndirizzo(dialogHandler.getParameter("indirizzo"));
                stud.setIdcorso(new CorsoStudio(Integer.parseInt(dialogHandler.getParameter("corso"))));
                SessionManager.setAttribute(dialogHandler.getSession(), "studente", stud);
                return ERR_MISSED_FIELD;
            } else
                SessionManager.setConfirmMessage(dialogHandler.getSession(), "Inserimento avvenuto con successo");
        } else {
            List<CorsoStudio> listaCorsiStudio = corsoStudioFacade.findAll();
            SessionManager.setAttribute(dialogHandler.getSession(), "corsi_di_studio", listaCorsiStudio);
        }
        
        return SUCCESS;
    }

    @Override
    public IRequestHandler clone(DialogHandler dHandler) throws CloneNotSupportedException {
        return new AddStudenteHandler(dHandler);
    }
}